package doc.com.network.webservice;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * Java为网络支持提供了java.net包,该包下的URL和URLConnection等类提供了以编码方式访问Web服务的功能,
 * 而URLDecoder和URLEncoder则提供普通字符串和application/x-www-form-urlencoded MIME字符串相互转换的静态方法。
 */
public class InetAddressTest {

    /**
     *      使用InetAddress类来代表IP地址,inetAddress下还有2个子类:Inet4Address, Inet6Address,
     * 它们分别代表了Internet Protocol version 4(IPV4)地址和Internet Protocol version 6(IPV6) 地址。
     * InetAddress类没有提供构造器,而是提供了如下两个静态方法获取InetAddress实例:
     * getByName(String host): 根据主机获取对应的InetAddress对象。
     * getByAddress(byte[] addr):根据原始IP地址来获取对应的InetAddress对象。
     * InetAddress还提供了如下三个方法来获取InetAddress实例对应的IP地址和主机名:
     *      String getCanonicalHostName(): 获取此IP地址的全限定域名。
     *      String getHostAddress(): 返回该InetAddress实例对应的IP地址字符串(以字符串形式)。
     *      String getHostName(): 获取此IP地址的主机名。
     *
     *      除此之外,InetAddress类还提供了一个getLocalHost()方法来获取本机IP地址对应的InetAddress实例。
     * InetAddress类还提供了一个isReachable()方法,用于测试是否可以到达该地址。该方法的实现将尽最大
     * 努力试图到达主机,但防火墙和服务器配置可能阻塞请求,使其在某些特定的端口可以访问时处于不可达的状态。
     * 如果可以获得权限,则典型实现将使用ICMP ECHO REQUEST;否则它将试图在目标主机的端口7Echo上建立TCP连接。
     * 下面程序测试了InetAddress的简单用法:
     */
    public static void main(String[] args) throws IOException {

        //根据主机名来获取对应的InetAddress实例
        InetAddress ip = InetAddress.getByName("www.baidu.com");
        //判断是否可达
        System.out.println("baidu是否可达:" + ip.isReachable(2000));

        //获取该InetAddress实例的IP字符串
        System.out.println(ip.getHostAddress());

        //根据原始IP地址来获取对应的InetAddress实例
        InetAddress local = InetAddress.getByAddress(new byte[]{127, 0, 0, 1});
        System.out.println("本机是否可达:" + local.isReachable(2000));

        //获取该InetAddress实例对应的全限定域名
        System.out.println(local.getHostAddress());

    }


}
